<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
use App\Models\Post;

class UpdatePostRequest extends FormRequest
{
    /**
     * 判断用户是否有权限进行此请求
     *
     * @return bool
     */
    public function authorize(): bool
    {
        // 只有已认证用户可以更新文章
        // 具体的权限检查（如是否是自己创建的文章）在控制器或Policy中处理
        return auth()->check();
    }

    /**
     * 获取验证规则
     *
     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array|string>
     */
    public function rules(): array
    {
        $postId = $this->route('id'); // 从路由获取文章ID
        
        return [
            'title' => 'required|string|max:255',
            'content' => 'required|string',
            'excerpt' => 'nullable|string',
            'slug' => [
                'nullable',
                'string',
                'max:255',
                // slug唯一性验证在控制器中处理，因为可能需要自动生成
            ],
            'category_id' => 'required|exists:categories,id',
            'tags' => 'nullable|array',
            'tags.*' => [
                // 允许整数（标签ID）或字符串（标签名称）
                function ($attribute, $value, $fail) {
                    if (!is_numeric($value) && !is_string($value)) {
                        $fail('标签必须是标签ID（整数）或标签名称（字符串）');
                    }
                    // 如果是数字，验证标签是否存在
                    if (is_numeric($value) && !\App\Models\Tag::where('id', $value)->exists()) {
                        $fail('所选标签不存在');
                    }
                },
            ],
            'series_id' => 'nullable|exists:series,id',
            'series_order' => 'nullable|integer|min:0',
            'sort_mode' => 'nullable|in:manual,date',
            'status' => 'required|in:draft,published,scheduled',
            'scheduled_publish_at' => [
                'nullable',
                'date',
                'after:now',
                Rule::requiredIf($this->input('status') === 'scheduled'),
            ],
            'featured_image' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
            'featured_image_url' => 'nullable|string|url',
            'settings' => 'nullable|array',
            'settings.allowComments' => 'nullable|boolean',
            'settings.isFeatured' => 'nullable|boolean',
        ];
    }

    /**
     * 获取验证错误的自定义消息
     *
     * @return array<string, string>
     */
    public function messages(): array
    {
        return [
            'title.required' => '文章标题是必填项',
            'title.max' => '文章标题不能超过255个字符',
            'content.required' => '文章内容是必填项',
            'category_id.required' => '请选择文章分类',
            'category_id.exists' => '所选分类不存在',
            'status.required' => '请选择文章状态',
            'status.in' => '文章状态无效',
            'scheduled_publish_at.required' => '定时发布需要设置发布时间',
            'scheduled_publish_at.after' => '定时发布时间必须是未来时间',
            'tags.array' => '标签格式不正确',
            'tags.*' => '标签必须是标签ID（整数）或标签名称（字符串）',
            'series_id.exists' => '所选系列不存在',
            'series_order.integer' => '系列顺序必须是整数',
            'series_order.min' => '系列顺序不能小于0',
            'sort_mode.in' => '排序模式无效',
            'slug.max' => 'URL别名不能超过255个字符',
            'featured_image.url' => '特色图片URL格式不正确',
        ];
    }

    /**
     * 获取自定义属性名称
     *
     * @return array<string, string>
     */
    public function attributes(): array
    {
        return [
            'title' => '文章标题',
            'content' => '文章内容',
            'excerpt' => '文章摘要',
            'slug' => 'URL别名',
            'category_id' => '文章分类',
            'tags' => '文章标签',
            'status' => '文章状态',
            'scheduled_publish_at' => '定时发布时间',
            'featured_image' => '特色图片',
            'settings' => '文章设置',
        ];
    }
}

